package cn.stylefeng.guns.modular.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class WeekBetweenCount {
    /**
     * 格式化日期，参数是date
     * @param date
     * @return
     */
    public static String formatDate(Date date) {
        String formDate = "";
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        formDate = format.format(date);

        return formDate;
    }

    /**
     * 格式化日期，参数是字符串
     * @param date
     * @return
     * @throws ParseException
     */
    public static Date formatDate(String date)  {
        Date time = new Date();

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        try {
            time = format.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return time;

    }

    /**
     * 计算两个日期之间相差的天数
     * @param smdate 较小的时间
     * @param bdate  较大的时间
     * @return 相差天数
     * @throws ParseException
     */
    public static int daysBetween(Date smdate,Date bdate) throws ParseException {
        //格式化日期
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        smdate=sdf.parse(sdf.format(smdate));
        bdate=sdf.parse(sdf.format(bdate));

        Calendar cal = Calendar.getInstance();
        cal.setTime(smdate);
        long time1 = cal.getTimeInMillis();

        cal.setTime(bdate);
        long time2 = cal.getTimeInMillis();

        long between_days = (time2 - time1) / (1000 * 3600 * 24) + 1;
        int days = Integer.parseInt(String.valueOf(between_days));
        return days;

    }


    /**
     * 计算指定年度共有多少个周。
     *
     * @param year
     *            格式 yyyy ，必须大于1900年度 小于9999年
     * @return
     */
    public static int getWeekNumByYear(final int year) {
        if (year < 1900 || year > 9999) {
            throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
        }
        int result = 52;// 每年至少有52个周 ，最多有53个周。
        String date = getYearWeekFirstDay(year, 53);

        if (date.substring(0, 4).equals(year + "")) { // 判断年度是否相符，如果相符说明有53个周。
            // System.out.println(date);
            result = 53;
        }
        return result;
    }

    /**
     * 计算某年某周的开始日期
     *
     *
     * @param yearNum
     *            格式 yyyy ，必须大于1900年度 小于9999年
     *
     * @param weekNum
     *            1到52或者53
     * @return 日期，格式为yyyy-MM-dd
     */
    public static String getYearWeekFirstDay(int yearNum, int weekNum) {

        Calendar cal = Calendar.getInstance();
        cal.setFirstDayOfWeek(Calendar.SUNDAY); // 设置每周的第一天为星期日
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);// 每周从周日开始

        // 上面两句代码配合，才能实现，每年度的第一个周，是包含第一个星期日的那个周。

        cal.setMinimalDaysInFirstWeek(7); // 设置每周最少为7天

        cal.set(Calendar.YEAR, yearNum);
        cal.set(Calendar.WEEK_OF_YEAR, weekNum);

        // 分别取得当前日期的年、月、日
        return formatDate(cal.getTime());
    }

    /**
     * 计算两个两个日期之间有多少周
     * @param start
     * @param end
     * @return
     */
    public static int weeksBetweenDays(String start, String end) {
        int counts = 1;
        Calendar c = Calendar.getInstance();
        Calendar c1 = Calendar.getInstance();
        Date startDate = formatDate(start);
        Date endDate = formatDate(end);
        c.setTime(startDate);
        c1.setTime(endDate);

        int weekofYear = c.get(Calendar.WEEK_OF_YEAR);
        int weekofYear1 = c1.get(Calendar.WEEK_OF_YEAR);

        System.out.println("start:" + weekofYear + " end week:"
                + weekofYear1);

        if (c.get(Calendar.YEAR) == c1.get(Calendar.YEAR)) {
            counts = weekofYear1 - weekofYear + 1;

        } else {

            int difyear = c1.get(Calendar.YEAR) - c.get(Calendar.YEAR);
            //

            System.out.println("year diff =" + difyear + " starty="
                    + c.get(Calendar.YEAR));
            if (difyear == 1) {// 年份相差一年
                int startyearWeeks = getWeekNumByYear(c.get(Calendar.YEAR));
                String date = getYearWeekFirstDay(c.get(Calendar.YEAR),
                        startyearWeeks);

                System.out.println(date);
                int ds = java.sql.Date.valueOf(date).compareTo(
                        java.sql.Date.valueOf(start));
                System.out.println(ds);

                if (ds <= 0) { // 这一年最后一周的开始一天小于用户选择的开始日期，比如，2009年最后一周的开始日期是2009-12-27号，所以开始日期大于或等于2009-12-27号的特殊处理。
                    counts = weekofYear1 - weekofYear + 1;
                } else {
                    counts = getWeekNumByYear(c.get(Calendar.YEAR))
                            - weekofYear + weekofYear1 + 1;
                }

            } else if (difyear > 1) {// 年份相差大于一年时，要考虑到
                for (int i = 0; i <= difyear; i++) {
                    int startAllWeeks = getWeekNumByYear(c
                            .get(Calendar.YEAR)
                            + i); // 开始日期的年份+i，如2007-12-22到2011-01-09，这里是遍历出07年，08年，09年分别有多少个周

                    if (i == 0) {//开始日期这一年的周差，如果07-12-22是第51周，07年共有52个周，那么，这里得到1.
                        counts = startAllWeeks - weekofYear;
                    } else if (i < difyear) {//除开始日期与结束日期所在一年的年份的周差。也就是08年共有多少周
                        counts += startAllWeeks;
                    } else if (i == difyear) { //加上09年所在的周
                        counts += weekofYear1;
                    }

                }
                counts += 1;
            }

        }

        return counts;
    }

}
